package chr

// https://www.php.net/manual/en/function.chr
func Do(ascii int) string {
	// return string(ascii)
	/*
		https://www.php.net/manual/zh/function.chr.php#91868
		chr(-number) is equal to chr((number%256)+256)

		https://www.php.net/manual/zh/function.chr.php#41471
		Note that if the number is higher than 256, it will return the number mod 256.
		For example :
		chr(321)=A because A=65(256)
	*/
	if ascii < 0 {
		ascii += 256
	}
	ascii = ascii % 256

	// chr(0)===>NULL char
	if ascii == 0 {
		return ""
	}

	/*
		PHP的chr返回其参数的ASCII字符，而Go的rune使用UTF-8。低于127，ASCII和UTF-8相同，但高于127，它们不同。
		补充知识：·ASCII码通常使用一个字节来存储一个字符
				·UTF-8可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码，属于Unicode标准的一部分，
				 就是为了解决向后兼容ASCII码而设计，Unicode中前128个字符，使用与ASCII码相同的二进制值的单个字节进行编码，
				 而且字面与ASCII码的字面一一对应，这使得原来处理ASCII字符的软件无须或只须做少部分修改，即可继续使用。
	*/
	// 0..127
	if ascii > 127 {
		return ""
	}
	return string(rune(ascii)) // 返回指定的字符
}
